package com.atguigu.test.mvc.controller;

import com.atguigu.test.mvc.editor.MyDateFormatter;
import com.atguigu.test.mvc.editor.MyStringEditor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author zp
 * @version 1.0
 * @description: 自定义 全局控制器处理 可以有三个注解
 * 1、@InitBinder 绑定数据解析器的 如果标注在一般的Controller类当中 生效范围为Controller类里面的请求
 * 2、@ExceptionHandler 解析异常处理类 统一处理全局的Controller的异常结果 可以配置捕获异常的类型
 *      备注嵌套异常处理：@ExceptionHandler 如果出现嵌套异常，springMVC的处理方式是 先获取到最外层的异常 然后判断是否含有起因异常
 *      如果有就继续循环 直到返回的异常结果为空的时候 所有的异常都会保存到一个List集合当中 然后遍历
 *      对应ExceptionHandler注解标注的方法参数异常匹配 如果匹配成功 就传入方法处理异常
 *
 * 3、@ModelAttribute 为请求的Model添加属性参数 也是全局范围处理
 * @date 2023/1/14 15:13
 */
@ControllerAdvice
@Slf4j
public class MyControllerAdvice {
    /**
     * @description: 全局的异常处理器
     * @author zp
     * @date: 2023/1/14 15:22
     * @param e
     */
    @ExceptionHandler(Exception.class)
    public void tryException(Exception e){
        log.info("打印捕获的异常消息[{}]",e.getMessage());
    }

    /**
     * @description: 全局的初始化自定义的数据解析器  可以解析参数
     * @author zp
     * @date: 2023/1/14 14:40
     * @param binder
     */
    @InitBinder
    public void webDataBinder(WebDataBinder binder) {
        // 把自定义的编辑器注册到数据绑定类当中
        binder.registerCustomEditor(String.class, new MyStringEditor());
        // 启用自定义 时间格式化转化器
        binder.addCustomFormatter(new MyDateFormatter());
    }
    /**
     * @description:  全局属性值添加 给所有的ModelAndView对象添加一个b参数
     * @author zp
     * @date: 2023/1/15 14:56
     * @param modelAndView
     */
    @ModelAttribute
    public void addModelAttribute(ModelAndView modelAndView){
        modelAndView.addObject("b","b");
    }
}
